package com.tjyx.common.bo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import com.tjyx.common.TJYXException;
import com.tjyx.common.dao.BaseDao;

/**
 * 业务逻辑对象BO基类
 * 
 * @author zhutianjie
 * 
 */
public class BaseBo {

	/*
	 * 数据访问对象基类
	 */
	private BaseDao baseDao = new BaseDao();
	/*
	 * 日志记录对象
	 */
	protected Logger logger = LogManager.getLogger("TJYX");
	/*
	 * 被JSONObject转换成JSON
	 */
	protected Map<String, Object> pageMap = null;
	/*
	 * 用于构造sql 
	 */
	protected Map<String,Object> sqlMap = null;
	/*
	 * Json对象名-查询到的记录条数
	 */
	protected static final String TOTAL_COUNT = "total";
	/*
	 * Json对象名-表格记录
	 */
	protected static final String ROWS = "rows";
	
	/*
	 * 查询起始行
	 */
	protected static int startRow = 0;
	
	/*
	 * 查询结束行 
	 */
	protected static int endRow = 0;

	/**
	 * 获取JSON,默认是按照id倒序查询
	 * 
	 * @param <T>
	 * @param page
	 *            页面
	 * @param rows
	 *            最大显示记录总数
	 * @param clazz
	 *            页面数据传输类
	 * @param tableName
	 *            查询的表名
	 * @return
	 * @throws TJYXException 
	 */
	public <T> String getPaginationJSON(int page, int rows, Class<T> clazz,
			String tableName) throws TJYXException {
		sqlMap = new HashMap<String,Object>();
		sqlMap.put("desc", "id"); //默认按照id值倒序查询
		pageMap = initPageMap(page,rows,clazz,tableName,sqlMap);
		JSONObject json = JSONObject.fromObject(pageMap); //将pageMap转换成JSONObject对象
		return json.toString();
	}
	
	/**
	 * 获取JSON,设置倒序查询的字段
	 * 
	 * @param <T>
	 * @param page 页码
	 * @param rows 最大显示
	 * @param clazz DTO类
	 * @param tableName 表名
	 * @param descField 用于构造sql查询语句
	 * @return
	 * @throws TJYXException
	 */
	public <T> String getPaginationJSON(int page, int rows, Class<T> clazz, String tableName, String descField) throws TJYXException {
		sqlMap = new HashMap<String,Object>();
		sqlMap.put("desc", descField); //倒序查询
		pageMap = initPageMap(page,rows,clazz,tableName,sqlMap);
		JSONObject json = JSONObject.fromObject(pageMap); //将pageMap转换成JSONObject对象
		return json.toString();
	}
	
	/**
	 * <p>获取JSON,预置构造SQL的sqlMap</p>
	 * @param <T>
	 * @param page 页码
	 * @param rows 最大显示
	 * @param clazz DTO类
	 * @param tableName 表名
	 * @param sqlMap 用于构造sql查询语句
	 * @return
	 * @throws TJYXException
	 */
	public <T> String getPaginationJSON(int page, int rows, Class<T> clazz, String tableName,Map<String,Object> sqlMap) throws TJYXException {
		sqlMap = new HashMap<String,Object>();
		sqlMap.put("desc", "id");
		pageMap = initPageMap(page,rows,clazz,tableName,sqlMap);
		JSONObject json = JSONObject.fromObject(pageMap); //将pageMap转换成JSONObject对象
		return json.toString();
	}
	
	/**
	 * 初始化pageMap
	 * @param <T>
	 * @param page 页码
	 * @param rows 最大显示
	 * @param clazz DTO类
	 * @param tableName 表名
	 * @param sqlMap 用于构造sql查询语句
	 * @return
	 * @throws TJYXException
	 */
	protected <T> Map<String,Object> initPageMap(int page, int rows, Class<T> clazz, String tableName,Map<String,Object> sqlMap) throws TJYXException {
		startRow = (page - 1) * rows + 1; //设置查询起始行
		endRow = startRow + rows - 1; //设置查询的结束行
		List<T> clazzList = baseDao.selectObjectList4Pagination(startRow, endRow,
				clazz, tableName,sqlMap);
		int totalCount = baseDao.selectCounter4Pagination(tableName,sqlMap);
		Map<String,Object> pageMap = new HashMap<String, Object>();
		pageMap.put(TOTAL_COUNT, totalCount);
		pageMap.put(ROWS, clazzList);
		return pageMap;
		
	}
}
